package chat;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

import javax.swing.JOptionPane;

/**
 * Tela de Cadastro de novo usuário.
 * 
 * @author Nara, Nelson e Lucas Trombeta
 */
public class LoginServiceImpl extends UnicastRemoteObject implements
		LoginService {

	/**
	 * Construtor
	 * 
	 * @throws RemoteException
	 */
	protected LoginServiceImpl() throws RemoteException {
		super();
	}

	ArrayList<Usuario> users = new ArrayList<Usuario>();

	/**
	 * Verifica o valor de status do usuário (se não tiver logado retorna 0)
	 */
	public int verificaStatus(String login) {
		return Usuario.procurarUsuario(users, login);
	}
	
	/**
	 * Procura se o usuário não está logado e adiciona-o na lista de logados
	 */
	public Usuario logar(String login, String senha) {
		int userindex = this.verificaStatus(login);
		if (userindex == -1) {
			if (!this.isCadastrado(login, senha)) {
				return null;
			} else {
				Usuario usuario = new Usuario(login);
				users.add(usuario);
				return usuario;
			}
		} else {
			JOptionPane.showMessageDialog(null,
					"Usuário já logado no sistema", "Atenção",
					JOptionPane.INFORMATION_MESSAGE);
			return users.get(userindex);
		}

	}

	/**
	 * Verifica se usuário já está cadastrado.
	 * 
	 * @param login
	 * @param senha
	 * @return true caso método seja executado corretamente
	 */
	public boolean isCadastrado(String login, String senha) {
		try {
			BufferedReader in = new BufferedReader(new FileReader("Dados.txt"));
			while (in.ready()) {
				String line = in.readLine();
				String elementos[] = line.split("::");

				if (elementos[0].equals(login) && elementos[2].equals(senha)) {
					in.close();
					return true;
				}
			}
		} catch (FileNotFoundException ex) {
			JOptionPane.showMessageDialog(null,
					"Não foi possível carregar aquivo de dados!", "Erro",
					JOptionPane.ERROR_MESSAGE);
			return false;
		} catch (IOException io) {
			JOptionPane.showMessageDialog(null,
					"Não foi possível ler o arquivo de dados!", "Erro",
					JOptionPane.ERROR_MESSAGE);
			return false;
		}

		JOptionPane.showMessageDialog(null, "Login ou senha inválidos!",
				"Atenção", JOptionPane.INFORMATION_MESSAGE);
		return false;
	}

	/**
	 * A fazer
	 */
	public boolean alterarStatus(String login, int status) {
		// A fazer
		return true;
	}

	/**
	 * Retira o usuário da lista de logados
	 */
	@Override
	public void deslogar(String login) {
		int userindex = Usuario.procurarUsuario(users, login);
		if (userindex != -1) {
			users.remove(userindex);
		} else {
			JOptionPane.showMessageDialog(null,
					"Usuário não logado no sistema", "Erro",
					JOptionPane.ERROR_MESSAGE);
		}

	}

	/**
	 * Lista usuários que estão logados.
	 */
	@Override
	public ArrayList<Usuario> listarUsuarios() throws RemoteException {
		return users;
	}

}
